注意: csrf_token验证只作用于POST的请求,GET等其他请求Django都会不进行验证,所以POST请求除外的都无需设置csrf_token

模板相关


  • csrf_token的作用: 跨站请求伪造保护,且一般用于form表单的POST请求中

  • csrf_token的通俗理解: 例如,有一个名为A的网址,如果没有设置csrf_token,那么任何网站都可以往这个A网址进行表单提交,如果设置了csrf_token 那么他就会只允许A网址的本站进行表单提交,其他网站对A网址进行表单提交都会无效

  • csrf_token的原理: 它会通过{% csrf_token %}生成一个input,且input的value就是本次form表单的唯一标识(每次刷新页面都会不一样),在进行表单提交的时候一并将该标识提交给后台,然后Django会自动验证该标识是否正确


  • 注意: 在刚开始我们所注释配置文件 settings.py 中的 csrf 配置项就是在表单提交的时候不进行 csrf 验证,但是在正常开发中不能把它注释掉,且在form表单中一定要加上 {% csrf_token %} 不然就会报错

<form action="/view_fn/" method="post">
    {% csrf_token %}
    <input type="text" name="uname">
    <input type="submit" value="提交">
</form>

  • 不加 {% csrf_token %} 的报错


视图相关


  • csrf_exempt 装饰器 -> 不验证当前视图函数的 csrf_token

# views.py

from django.views.decorators.csrf import csrf_exempt, csrf_protect


@csrf_exempt
def view_fn(request):
    return render(request, 'view_fn.html')

  • csrf_protect 装饰器 -> 验证当前视图的 csrf_token,前提是当 settings.py 中的 csrf 配置被注释掉

# views.py

from django.views.decorators.csrf import csrf_exempt, csrf_protect


@csrf_protect
def view_fn(request):
    return render(request, 'view_fn.html')